#include <Windows.h>  // 包含Windows API头文件

// 声明窗口消息处理函数
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

// 程序主入口（宽字符版本）
int WINAPI wWinMain(
    HINSTANCE hInstance,      // 当前程序的实例句柄
    HINSTANCE hPrevInstance,  // 历史遗留参数，始终为NULL
    PWSTR     pCmdLine,       // 命令行参数字符串（宽字符）
    int       nCmdShow        // 窗口初始显示状态
) {
    // ----------- 第一步：注册窗口类 -----------
    // 注意：使用宽字符字符串前缀 L
    const wchar_t* CLASS_NAME = L"MyUnicodeWindowClass";  // 宽字符窗口类名
    
    WNDCLASSW wc = {};  // 使用宽字符版本的WNDCLASSW
    
    // 设置窗口类属性：
    wc.lpfnWndProc   = WindowProc;        // 消息处理函数
    wc.hInstance     = hInstance;         // 程序实例
    wc.lpszClassName = CLASS_NAME;        // 宽字符类名
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);  // 白色背景
    wc.hCursor       = LoadCursorW(NULL, IDC_ARROW); // 宽字符版本

    // 向系统注册窗口类
    if (!RegisterClassW(&wc)) {
        MessageBoxW(NULL, L"窗口类注册失败!", L"错误", MB_ICONEXCLAMATION | MB_OK);
        return 0;
    }

    // ----------- 第二步：创建窗口实例 -----------
    HWND hwnd = CreateWindowW(  // 使用宽字符版本CreateWindowW
        CLASS_NAME,             // 注册的类名
        L"尼玛",     // 宽字符窗口标题
        WS_OVERLAPPEDWINDOW,    // 标准窗口样式
        
        // 位置和大小：
        CW_USEDEFAULT, CW_USEDEFAULT,  // X, Y坐标
        600, 400,                     // 宽度, 高度
        
        NULL,    // 没有父窗口
        NULL,    // 没有菜单
        hInstance, 
        NULL     // 没有额外数据
    );

    // 检查窗口是否创建成功
    if (hwnd == NULL) {
        MessageBoxW(NULL, L"窗口创建失败!", L"错误", MB_ICONEXCLAMATION | MB_OK);
        return 0;
    }

    // ----------- 第三步：显示和更新窗口 -----------
    ShowWindow(hwnd, nCmdShow);  // 显示窗口
    UpdateWindow(hwnd);           // 触发首次绘制

    // ----------- 第四步：消息循环 -----------
    MSG msg;
    while (GetMessageW(&msg, NULL, 0, 0)) {  // 宽字符版本
        TranslateMessage(&msg);
        DispatchMessageW(&msg);              // 宽字符版本
    }

    return 0;
}

// ----------- 窗口消息处理函数 -----------
LRESULT CALLBACK WindowProc(
    HWND hwnd, 
    UINT uMsg, 
    WPARAM wParam, 
    LPARAM lParam
) {
    switch (uMsg) {
    // 窗口需要重绘时
    case WM_PAINT: {
        PAINTSTRUCT ps;
        HDC hdc = BeginPaint(hwnd, &ps);
        
        // 使用宽字符文本绘制
        TextOutW(hdc, 50, 50, L"你好，Unicode世界!", 9);  // 中文宽字符
        
        EndPaint(hwnd, &ps);
        return 0;
    }

case WM_CREATE: {
        // 窗口创建时，创建按钮
		// 取出保存的 hInstance
        HINSTANCE hInst = reinterpret_cast<HINSTANCE>(
            GetWindowLongPtrW(hwnd, GWLP_USERDATA)
        );
        CreateWindowW(
            L"BUTTON",            // 控件类名
            L"666",               // 按钮文字
            WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,  // 样式
            50, 150, 120, 40,      // 位置和大小
            hwnd,                 // 父窗口
            (HMENU)1,             // 控件ID
            hInst,              // 使用全局实例句柄
            NULL
        );
        return 0;
    }
    
    // 用户点击关闭按钮时
    case WM_CLOSE:
        DestroyWindow(hwnd);
        return 0;
	
	case WM_COMMAND:
        if (LOWORD(wParam) == 1) {
            MessageBoxW(hwnd, L"你点击了按钮！", L"提示", MB_ICONEXCLAMATION | MB_OK);
        }
        return 0;
    
    // 窗口被销毁后
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }
    
    // 其他未处理的消息交给默认处理
    return DefWindowProcW(hwnd, uMsg, wParam, lParam);  // 宽字符版本
}